1   /*
2    * Copyright (c) 2001, 2007, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.
8    *
9    * This code is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12   * version 2 for more details (a copy is included in the LICENSE file that
13   * accompanied this code).
14   *
15   * You should have received a copy of the GNU General Public License version
16   * 2 along with this work; if not, write to the Free Software Foundation,
17   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18   *
19   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20   * or visit www.oracle.com if you need additional information or have any
21   * questions.
22   */
23  
24  /**
25   *  @test
26   *  @bug 4359628
27   *  @summary Test fix for JDI: methods Accessible.is...() lie about array types
28   *
29   *  @author Tim Bell
30   *
31   *  @run build TestScaffold VMConnection TargetListener TargetAdapter
32   *  @run compile -g AccessSpecifierTest.java
33   *  @run main AccessSpecifierTest
34   */
35  import com.sun.jdi.*;
36  import com.sun.jdi.event.*;
37  import com.sun.jdi.request.*;
38  
39  import java.util.*;
40  
41      /********** target program **********/
42  
43  
44  /** Sample package-private interface. */
45  interface AccessSpecifierPackagePrivateInterface {}
46  
47  /** Sample package-private class. */
48  class AccessSpecifierPackagePrivateClass {}
49  
50  /** Sample package-private class. */
51  class AccessSpecifierPackagePrivateClassTwo implements
52      AccessSpecifierPackagePrivateInterface {}
53  
54  class AccessSpecifierTarg {
55      private boolean z0;
56      boolean z1[]={z0}, z2[][]={z1};
57  
58      public byte b0;
59      byte b1[]={b0}, b2[][]={b1};
60  
61      protected short s0;
62      short s1[]={s0}, s2[][]={s1};
63  
64      int i0;
65      int i1[]={i0}, i2[][]={i1};
66  
67      private long l0;
68      long l1[]={l0}, l2[][]={l1};
69  
70      public char c0;
71      char c1[]={c0}, c2[][]={c1};
72  
73      protected float f0;
74      float f1[]={f0}, f2[][]={f1};
75  
76      double d0;
77      double d1[]={d0}, d2[][]={d1};
78  
79      Boolean   Z0 = Boolean.TRUE;
80      Boolean   Z1[]={Z0}, Z2[][]={Z1};
81      Byte      B0 = new Byte ((byte)0x1f);
82      Byte      B1[]={B0}, B2[][]={B1};
83      Character C0 = new Character ('a');
84      Character C1[]={C0}, C2[][]={C1};
85      Double    D0 = new Double (1.0d);
86      Double    D1[]={D0}, D2[][]={D1};
87      Float     F0 = new Float (2.0f);
88      Float     F1[]={F0}, F2[][]={F1};
89      Integer   I0 = new Integer (8675309);
90      Integer   I1[]={I0}, I2[][]={I1};
91      Long      L0 = new Long (973230999L);
92      Long      L1[]={L0}, L2[][]={L1};
93      String    S0 = "A String";
94      String    S1[]={S0}, S2[][]={S1};
95      Object    O0 = new Object();
96      Object    O1[]={O0}, O2[][]={O1};
97  
98      private   static class  U {}
99      protected static class  V {}
100     public    static class  W {}
101     static class  P {} // package private
102 
103     U u0=new U(), u1[]={u0}, u2[][]={u1};
104     V v0=new V(), v1[]={v0}, v2[][]={v1};
105     W w0=new W(), w1[]={w0}, w2[][]={w1};
106     P p0=new P(), p1[]={p0}, p2[][]={p1};
107 
108     private static interface StaticInterface {}
109     private static class ClassUsingStaticInterface
110         implements StaticInterface {}
111 
112     StaticInterface staticInterface_0 = new ClassUsingStaticInterface();
113     StaticInterface staticInterface_1[]={staticInterface_0};
114     StaticInterface staticInterface_2[][]={staticInterface_1};
115 
116     AccessSpecifierTarg a0, a1[]={a0}, a2[][]={a1};
117 
118     AccessSpecifierPackagePrivateClass ppc0=new AccessSpecifierPackagePrivateClass();
119     AccessSpecifierPackagePrivateClass ppc1[]={ppc0};
120     AccessSpecifierPackagePrivateClass ppc2[][]={ppc1};
121 
122     AccessSpecifierPackagePrivateInterface ppi0 =
123         new AccessSpecifierPackagePrivateClassTwo ();
124     AccessSpecifierPackagePrivateInterface ppi1[]={ppi0};
125     AccessSpecifierPackagePrivateInterface ppi2[][]={ppi1};
126 
127     public AccessSpecifierTarg() {
128         super();
129     }
130 
131     public void ready(){
132         System.out.println("Ready!");
133     }
134 
135     public static void main(String[] args){
136         System.out.println("Howdy!");
137         AccessSpecifierTarg my = new AccessSpecifierTarg();
138         my.ready();
139         System.out.println("Goodbye from AccessSpecifierTarg!");
140     }
141 }
142 
143     /********** test program **********/
144 
145 public class AccessSpecifierTest extends TestScaffold {
146 
147     private final static String debugeeName = "AccessSpecifierTarg";
148 
149     /** Known Accessible Information about the Debugee. */
150     private static final int NAME = 0;
151     private static final int ACCESS = 1;
152     private final static String primitives[][] = {
153         {"z", "private", "public", "public"},
154         {"b", "public", "public", "public"},
155         {"s", "protected", "public", "public"},
156         {"i", "package private", "public", "public"},
157         {"l", "private", "public", "public"},
158         {"c", "public", "public", "public"},
159         {"f", "protected", "public", "public"},
160         {"d", "package private", "public", "public"},
161     };
162     private final static String references[][] = {
163         {"java.lang.Boolean"  , "public"},
164         {"java.lang.Character", "public"},
165         {"java.lang.Class"    , "public"},
166         {"java.lang.Double"   , "public"},
167         {"java.lang.Float"    , "public"},
168         {"java.lang.Integer"  , "public"},
169         {"java.lang.Long"     , "public"},
170         {"java.lang.String"   , "public"},
171         {"java.lang.Object"   , "public"},
172 
173         {"AccessSpecifierTarg", "package private"},
174         {"AccessSpecifierPackagePrivateClass", "package private"},
175         {"AccessSpecifierPackagePrivateInterface", "package private"},
176 
177         {"AccessSpecifierTarg$StaticInterface", "private"},
178 
179         {"AccessSpecifierTarg$U", "private"},
180         {"AccessSpecifierTarg$V", "protected"},
181         {"AccessSpecifierTarg$W", "public"},
182         {"AccessSpecifierTarg$P", "package private"}
183     };
184 
185     AccessSpecifierTest (String args[]) {
186         super(args);
187     }
188 
189     public static void main(String[] args)      throws Exception {
190         new AccessSpecifierTest (args).startTests();
191     }
192 
193     /********** test core **********/
194 
195     private void testAccessible (String name, Accessible a,
196                                  boolean isPublic, boolean isProtected,
197                                  boolean isPrivate, boolean isPackagePrivate) {
198         System.out.println ("  Testing: " + name + " modifiers = " +
199                             Integer.toBinaryString(a.modifiers()));
200         if (a.isPublic() != isPublic) {
201             failure("**Name = " + name + " expecting: " + isPublic +
202                     " isPublic() was: " + a.isPublic());
203         }
204         if (a.isPrivate() != isPrivate) {
205             failure("**Name = " + name + " expecting: " + isPrivate +
206                     " isPrivate() was: " + a.isPrivate());
207         }
208         if (a.isProtected() != isProtected) {
209             failure("**Name = " + name + " expecting: " + isProtected +
210                     " isProtected() is: " + a.isProtected());
211         }
212         if (a.isPackagePrivate() != isPackagePrivate) {
213             failure("**Name = " + name + " expecting: " + isPackagePrivate +
214                     " isPackagePrivate() is: " + a.isPackagePrivate());
215         }
216     }
217 
218     protected void runTests() throws Exception {
219         /*
220          * Get to the top of ready()
221          */
222         startTo(debugeeName, "ready", "()V");
223 
224         ReferenceType rt = findReferenceType(debugeeName);
225         if (rt == null) {
226             throw new Exception ("ReferenceType not found for: " + debugeeName);
227         }
228         for (int i = 0; i < primitives.length; i++) {
229             for (int j = 0; j < 3; j++) {
230                 String suffix = Integer.toString(j);
231                 String fieldName = primitives[i][NAME] + suffix;
232                 Field field = rt.fieldByName(fieldName);
233                 if (field == null) {
234                     throw new Exception ("Field not found for: " + fieldName);
235                 }
236 
237                 Type t = field.type();
238                 if (t instanceof ReferenceType) {
239                     ReferenceType reft = (ReferenceType)t;
240                     if (primitives[i][ACCESS + j].equals("public")) {
241                         testAccessible(reft.name(), reft,
242                                        true, false, false, false);
243                     } else if (primitives[i][ACCESS + j].equals("protected")) {
244                         testAccessible(reft.name(), reft,
245                                        false, true, false, false);
246                     } else if (primitives[i][ACCESS + j].equals("private")) {
247                         testAccessible(reft.name(), reft,
248                                        false, false, true, false);
249                     } else if (primitives[i][ACCESS + j].equals("package private")) {
250                         testAccessible(reft.name(), reft,
251                                        false, false, false, true);
252                     }
253                 } else {
254                     System.out.println ("  Skipping " + t +
255                                         " (primitive scalar type)");
256                 }
257             }
258         }
259 
260         String brackets[] = {"[][]", "[]", ""};
261 
262         for (int i = 0; i < references.length; i++) {
263             for (int j = 0; j < 3; j++) {
264                 String suffix = brackets[j];
265                 String referenceName = references[i][NAME] + suffix;
266                 ReferenceType refType = findReferenceType(referenceName);
267                 if (refType == null) {
268                     System.out.println ("Skipping " + referenceName +
269                                         " (not found)");
270                 } else {
271                     if (references[i][ACCESS].equals("public")) {
272                         testAccessible(refType.name(), refType, true, false, false, false);
273                     } else if  (references[i][ACCESS].equals("protected")) {
274                         testAccessible(refType.name(), refType, false, true, false, false);
275                     } else if  (references[i][ACCESS].equals("private")) {
276                         testAccessible(refType.name(), refType, false, false, true, false);
277                     } else if  (references[i][ACCESS].equals("package private")) {
278                         testAccessible(refType.name(), refType, false, false, false, true);
279                     }
280                 }
281             }
282         }
283 
284         /*
285          * resume the target listening for events
286          */
287         listenUntilVMDisconnect();
288 
289         /*
290          * deal with results of test
291          * if anything has called failure("foo") testFailed will be true
292          */
293         if (!testFailed) {
294             println("AccessSpecifierTest: passed");
295         } else {
296             throw new Exception("AccessSpecifierTest: failed");
297         }
298     }
299 }